Day 24: GitLab CI/CD 基本概念與工作流程
Day 25: GitLab Runners 配置與使用
Day 26: 使用 GitLab CI/CD 進行原始碼掃描及套件掃描
Day 27: 使用 GitLab CI/CD 進行自動化測試
Day 28: 如何在 GitLab CI/CD 中實現持續部署 (CD)
Day 29: GitLab CI/CD 與 Kubernetes 的集成實踐
因為免費方案之硬體需求關係,此章節會以GCP作為雲端平台來操作。
docker run -itd --net=host --privileged=true --name <換個名字> --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker gitlab/gitlab-runner:ubuntu-v16.2.0
#進入容器
docker exec -it <容器ID> bash
#註冊
gitlab-runner register
docker-compose.yml
version: "3"
services:
sonarqube:
image: sonarqube:community
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
ports:
- "9000:9000"
db:
image: postgres:12
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
第一次啟動通常會報錯
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
sudo vim /etc/sysctl.conf
#追加以下内容:
vm.max_map_count=262144
#保存退出
#套用
sudo sysctl -p
預設帳號密碼admin
Create a local project > Use the global setting > with GitLab CI
這裡先建立一個名為「test」的專案,待會會用到
按照指示到gitlab的專案配置兩個環境變數
同時上傳參數文件(剛才的環境變數是官網建議步驟,底下這份是可以詳細設定)
sonar-project.properties
#剛才建立的專案名稱
sonar.projectKey=test
sonar.qualitygate.wait=true
sonar.language=
sonar.sources=.
# sonar.inclusions=**/*.go,**/*.py,**/*.js
逃不了要寫code的命運,還好有chatgpt,謝謝chatgpt(可自行放入被掃描的檔案)
切到自己新增的branch(因為最後都是合併回main並觸發CI流程)
app.py
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def hello_world():
return jsonify(message="Hello, World!")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
requirements.txt
Flask==2.2.3
Dockerfile
# 使用官方 Python 映像作為基礎映像
FROM python:3.10-slim
# 設置工作目錄
WORKDIR /app
# 複製 requirements.txt 到容器
COPY requirements.txt .
# 安裝 Python 依賴
RUN pip install --no-cache-dir -r requirements.txt
# 複製 Flask 應用到容器
COPY app.py .
# 暴露容器內的 5000 端口
EXPOSE 5000
# 設置環境變量
ENV FLASK_APP=app.py
# 設置 Flask 以外部訪問
ENV FLASK_RUN_HOST=0.0.0.0
# 啟動 Flask 應用
CMD ["flask", "run"]
.gitlab-ci.yml
stages:
- build
- scan
- scandependency
build:
stage: build
image: docker:20.10
tags:
- scan
script:
- echo "Building Docker image..."
only:
- merge_requests
scan:
stage: scan
tags:
- scan
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
image:
name: sonarsource/sonar-scanner-cli:5.0
entrypoint: [""]
variables:
GIT_DEPTH: 0
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner
allow_failure: true
dependencies:
- build
scandependency:
stage: scandependency
tags:
- scan
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
image:
name: aquasec/trivy:latest
entrypoint: [""]
script:
- trivy fs --scanners vuln --exit-code 0 --severity CRITICAL,HIGH . --format json --output trivy-report.json
allow_failure: true
artifacts:
paths:
- trivy-report.json
dependencies:
- scan
最後應該長這樣
啊哈,可是我們沒有要build它,只是拿來當被掃描的待宰羔羊
每個階段的掃描過程可以點進去看
訪問SonarQube網站點擊進入test專案
專注在於優先修復Security中高風險以及Security Hotspots中高風險
在掃描參數已經配置只列出CRITICAL及HIGH風險等級
內容可參考當前安裝版本,以及建議升級版本
至此就完成了將原始碼掃描及套件掃描結合到CI流程裡面了